/*
 * main.cpp
 *
 */

#include <iostream>
#include "Server.h"
#include "ExitListener.h"
#include "../common/LogFile.h"
#include "../common/ServerConfig.h"

int main(int argc, char* argv[]) {
	try {
		// Si vienen dos parametros, 
		// el segundo debe ser el path/nombre del archivo de configuraciones
		std::string nomArchConfig = "config.xml";
		if (argc == 2) nomArchConfig = argv[1];

		// Levanto la configuración del XML
		ServerConfig config(nomArchConfig);

		// Inicio el archivo de log en modo de escritura
		LogFile logFile(config.getPathLogAccesos(),
				config.getPathLogErrores(), true);

		// Inicio el server
		Server server(config, logFile);
		server.start();

		logFile.addInfo("Servidor iniciado.");

		// Espero evento de salida
		ExitListener exitListener(argc, argv, config.getCtrlPort(), logFile);
		exitListener.waitForExitEvent();

		// Detengo al server
		server.shutdown();
		server.join();

		logFile.addInfo("Servidor cerrado.");
	}
	catch (const LogFileException& e) {
		// No se pudo abrir el archivo para escritura
		std::cout << e.what() << std::endl;
		return 1;
	}
	catch (const ThreadException& e) {
		// Error de lanzamiento del server
		std::cout << e.what() << std::endl;
		return 1;
	}
	catch (const std::exception& e) {
		// Error de parseo del XML
		std::cout << e.what() << std::endl;
		return 1;
	}
	catch (...){
		std::cout << "Salida por excepción no contemplada.\n";
		return 1;
	}
	return 0;
}
